/**
 * @file    fileChecker.h
 * @author  wuhui1536@gmail.com
 * @date    2025-02-19
 * @brief   文件类型检测器 - 头文件
 *
 * @details
 * 该文件定义了文件签名匹配的结构体和类接口，提供文件格式识别功能。
 * 包括文件签名规则的存储、解析 JSON 规则文件、匹配文件类型等功能。
 *
 * @note
 * 需要使用 JSON 规则文件进行匹配，确保 JSON 文件格式正确。
 *
 */

#ifndef FILE_CHECKER_H
#define FILE_CHECKER_H

#include <vector>
#include <string>

using namespace std;

/**
 * @struct FileSignatureRule
 * @brief 文件签名规则结构体
 *
 * 存储文件格式的十六进制头部签名、扩展名和描述信息。
 */
struct FileSignatureRule
{
    string type;               ///< 文件类型名称
    vector<string> extensions; ///< 可能的文件扩展名
    vector<string> signatures; ///< 十六进制签名
    size_t offset;             ///< 签名在文件中的偏移量
    string description;        ///< 规则描述

    FileSignatureRule(); ///< 默认构造函数
};

/**
 * @class FileChecker
 * @brief 文件检测器类
 *
 * 该类用于解析 JSON 规则文件并匹配文件格式。
 */
class FileChecker
{
private:
    vector<FileSignatureRule> rules; ///< 规则列表

    /**
     * @brief 读取 JSON 规则文件
     * @param filename JSON 规则文件路径
     * @return 是否成功加载
     */
    bool loadRulesFromJson(const string &filename);

    /**
     * @brief 读取文件的前 N 个字节并转换为十六进制字符串
     * @param filePath 目标文件路径
     * @param bytesToRead 读取的字节数（默认 16）
     * @return 以十六进制表示的文件头部字符串
     */
    string readFileHeader(const string &filePath, int bytesToRead = 16) const;

public:
    /**
     * @brief 构造函数，加载 JSON 规则
     * @param ruleFile JSON 规则文件路径
     */
    FileChecker(const string &ruleFile);

    /**
     * @brief 匹配文件类型
     * @param filePath 目标文件路径
     * @return 识别到的文件类型（如果匹配不到返回 "Unknown"）
     */
    string matchFileType(const string &filePath) const;
};

#endif // FILE_CHECKER_H
